package com.wyj.pojo;

import com.wyj.config.BoundSql;
import com.wyj.config.SqlCommandType;
import com.wyj.utils.GenericTokenParser;
import com.wyj.utils.ParameterMapping;
import com.wyj.utils.ParameterMappingTokenHandler;

import java.util.List;

/**
 * @description: TODO
 * @author wuyijie
 * @date 2021/10/30 10:59 上午
 */
public class MapperedStatement {
    /**
     * 语句ID
     * */
    private String id;
    /**
     * 语句返回值类型
     * */
    private Class<?> resultType;
    /**
     * 语句参数类型
     * */
    private Class<?> parameterType;
    /**
     * 执行语句
     * */
    private String sql;

    /**
     * sql类型。
     * */
    private SqlCommandType SqlCommandType;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Class<?> getResultType() {
        return resultType;
    }

    public void setResultType(Class<?> resultType) {
        this.resultType = resultType;
    }

    public Class<?> getParameterType() {
        return parameterType;
    }

    public void setParameterType(Class<?> parameterType) {
        this.parameterType = parameterType;
    }

    public String getSql() {
        return sql;
    }

    public void setSql(String sql) {
        this.sql = sql;
    }

    public com.wyj.config.SqlCommandType getSqlCommandType() {
        return SqlCommandType;
    }

    public void setSqlCommandType(com.wyj.config.SqlCommandType sqlCommandType) {
        SqlCommandType = sqlCommandType;
    }

    /**
     * TODO: 完成#{} 的解析。1、将#{}替换为？ 2、参数赋值
     *
     * @return com.wyj.config.BoundSql
     * @author wuyijie
     * @date 2021/10/30 2:35 下午
     */
    public BoundSql getBoundSql() {
        ParameterMappingTokenHandler parameterMappingTokenHandler = new ParameterMappingTokenHandler();
        // 获取解析后的sql文本
        String parse = new GenericTokenParser("#{", "}", parameterMappingTokenHandler).parse(sql);
        // 解析后的参数名称
        List<ParameterMapping> parameterMappings = parameterMappingTokenHandler.getParameterMappings();
        return new BoundSql(parse, parameterMappings);
    }
}
